Webサイトの表示速度はSEO・ユーザー体験・コンバージョン率に直結します。Googleの調査では、ページ読み込みが3秒を超えると53%のユーザーが離脱するとされています。本記事では、Core Web Vitalsを中心に、すぐに実践できるパフォーマンス最適化テクニックを解説します。

💡 この記事のポイント

パフォーマンス改善は「計測 → 改善 → 計測」のサイクルが重要です。まずChrome DevToolsのLighthouseでスコアを確認してから取り組みましょう。

1. Core Web Vitalsとは

GoogleがWebページの品質を評価する3つの指標です。検索ランキングにも影響します。

  • LCP(Largest Contentful Paint):最大コンテンツの表示時間 → 2.5秒以内が良好
  • INP(Interaction to Next Paint):インタラクション応答速度 → 200ms以内が良好
  • CLS(Cumulative Layout Shift):レイアウトのズレの累積 → 0.1以下が良好

2. LCPの改善

LCPはユーザーが「ページが表示された」と感じるまでの時間です。

改善テクニック

<!-- 1. 重要なリソースのプリロード -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/hero-image.webp" as="image">

<!-- 2. 外部リソースへの事前接続 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://analytics.example.com">

<!-- 3. クリティカルCSSのインライン化 -->
<style>
  /* ファーストビューに必要な最小限のCSS */
  body { margin: 0; font-family: system-ui; }
  .hero { min-height: 100vh; display: flex; align-items: center; }
</style>

<!-- 4. 非クリティカルCSSの遅延読み込み -->
<link rel="stylesheet" href="/style.css" media="print" onload="this.media='all'">
広告

3. CLSの改善

CLSはページのレイアウトが突然ズレる問題です。広告の遅延読み込みや画像のサイズ未指定が主な原因です。

<!-- ❌ CLSを引き起こすコード -->
<img src="photo.jpg">  <!-- width/heightの指定なし -->

<!-- ✅ CLSを防ぐコード -->
<img src="photo.jpg" width="800" height="600" alt="説明"
     style="aspect-ratio: 4/3; width: 100%; height: auto;">

<!-- ✅ 広告枠のスペース予約 -->
<div style="min-height: 250px;">
  <!-- 広告コンテンツ -->
</div>

<!-- ✅ Webフォントのfont-display設定 -->
<style>
@font-face {
  font-family: 'CustomFont';
  src: url('/fonts/custom.woff2') format('woff2');
  font-display: swap; /* テキストの非表示時間を最小化 */
}
</style>

4. 画像最適化

画像は一般的にWebページのデータ量の50%以上を占めます。

<!-- 次世代フォーマット(WebP/AVIF)の活用 -->
<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="説明" width="800" height="600" loading="lazy">
</picture>

<!-- レスポンシブ画像 -->
<img
  srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w"
  sizes="(max-width: 600px) 400px, (max-width: 900px) 800px, 1200px"
  src="image-800.webp"
  alt="説明"
  loading="lazy"
  decoding="async"
>
✅ 画像フォーマットの選び方

AVIFが最も圧縮率が高い(JPEGの50%以下)。対応ブラウザが広いWebPをベースに、AVIFをプログレッシブエンハンスメントで提供するのが最適です。

5. 遅延読み込み戦略

// 画像のネイティブ遅延読み込み(HTML属性)
// loading="lazy" をimgタグに追加するだけ

// JavaScriptの遅延読み込み(動的インポート)
const loadChart = async () => {
  const { Chart } = await import('chart.js');
  // チャートの初期化
};

// Intersection Observerによる要素の遅延読み込み
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
}, { rootMargin: '200px' }); // 200px手前から読み込み開始

// スクリプトの非同期読み込み
// async: ダウンロード後すぐ実行(順序保証なし)
// defer: HTML解析完了後に順序通り実行
// <script src="analytics.js" defer></script>

6. キャッシュ戦略

# .htaccess または nginx.conf でのキャッシュ設定例

# 静的ファイルのブラウザキャッシュ
# CSS/JS: ハッシュ付きファイル名なら長期キャッシュ
Cache-Control: public, max-age=31536000, immutable

# HTML: 短いキャッシュ + 再検証
Cache-Control: public, max-age=3600, must-revalidate

# API: キャッシュなし
Cache-Control: no-cache, no-store, must-revalidate

パフォーマンス計測ツール

  • Lighthouse(Chrome DevTools内蔵):総合スコアと改善提案
  • PageSpeed Insights:実ユーザーデータ(CrUX)+ Lighthouse
  • WebPageTest:詳細なウォーターフォール分析
  • Chrome DevTools Performance:ランタイムパフォーマンス分析

パフォーマンス最適化は小さな改善の積み重ねです。まずはLighthouseでスコアを確認し、最も影響の大きい項目から着手しましょう。1秒の高速化がコンバージョン率7%向上につながるケースもあります。